import type { ConfigEnv, UserConfig } from 'vite';
import { defineConfig, loadEnv } from 'vite';
import { resolve } from 'path';

import { wrapperEnv } from './build/utils';
import { createVitePlugins } from './build/vite/plugin';

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => {
  const env = wrapperEnv(loadEnv(mode, process.cwd()));

  const { VITE_PORT = 3000, VITE_APP_BASE_API, VITE_APP_BASE_URL, VITE_APP_UPLOAD_API, VITE_APP_UPLOAD_URL } = env;
  // 插件
  const plugins = createVitePlugins(mode, command);
  // 配置
  const config: UserConfig = {
    resolve: {
      alias: {
        /** @ 符号指向 src 目录 */
        '@': resolve(__dirname, './src'),
        '#': resolve(__dirname, './types')
      }
    },
    server: {
      /** 设置 host: true 才可以使用 Network 的形式，以 IP 访问项目 */
      host: true,
      /** 端口号 */
      port: VITE_PORT,
      /** 是否自动打开浏览器 */
      open: false,
      /** 跨域设置允许 */
      cors: true,
      /** 端口被占用时，是否直接退出 */
      strictPort: false
      /** 接口代理 */
      // proxy: {
      //   [VITE_APP_BASE_API]: {
      //     target: VITE_APP_BASE_URL,
      //     ws: true,
      //     /** 是否允许跨域 */
      //     changeOrigin: true,
      //     // 路径重写
      //     rewrite: (path) => path.replace(new RegExp(`^/${VITE_APP_BASE_API}/`), '/')
      //   },
      //   [VITE_APP_UPLOAD_API]: {
      //     target: VITE_APP_BASE_URL,
      //     ws: true,
      //     /** 是否允许跨域 */
      //     changeOrigin: true,
      //     // 路径重写
      //     rewrite: (path) => path.replace(new RegExp(`^/${VITE_APP_UPLOAD_URL}/`), '/')
      //   }
      // }
    },
    css: {
      preprocessorOptions: {
        // 这里配置 mixin.scss 混合文件和global.scss的全局引入
        scss: {
          additionalData: `
          @import "@/styles/mixin.scss";
          @import "@/styles/global.scss";
        `
        }
      }
    },
    /** 混淆器 */
    esbuild: {
      /** 打包时移除 console.log */
      pure: ['console.log'],
      /** 打包时移除 debugger */
      drop: ['debugger'],
      /** 打包时移除所有注释 */
      legalComments: 'none'
    },
    build: {
      /** 单个 chunk 文件的大小超过 2048KB 时发出警告 */
      chunkSizeWarningLimit: 2048,
      /** 禁用 gzip 压缩大小报告 */
      reportCompressedSize: false,
      /** 打包后静态资源目录 */
      assetsDir: 'static',
      rollupOptions: {
        output: {
          /**
           * 分块策略
           */
          chunkFileNames: 'static/js/[name]-[hash].js', // 引入文件名的名称
          entryFileNames: 'static/js/[name]-[hash].js', // 包的入口文件名称
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]', // 资源文件像 字体，图片等
          manualChunks: {
            vue: ['vue', 'vue-router', 'pinia'],
            element: ['element-plus', '@element-plus/icons-vue']
          }
        }
      }
    },
    plugins
  };

  return config;
});
